package com.kamistoat.ruoyi.ruoyimoduleslocalfile.controller;

import com.kamistoat.ruoyi.ruoyiapisystem.domain.SysFile;
import com.kamistoat.ruoyi.ruoyicommoncore.domain.R;
import com.kamistoat.ruoyi.ruoyicommoncore.utils.file.FileUtils;
import com.kamistoat.ruoyi.ruoyimoduleslocalfile.service.SysFileService;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;

/**
 * 文件本地持久化接口
 */
@RestController
@RequestMapping("/file")
public class SysFileController {
    private static final Logger LOGGER = LoggerFactory.getLogger(SysFileController.class);

    // 以纯粹的本地持久化算法实现的 文件持久化
    @Qualifier("LocalSysFileServiceImpl")
    @Autowired
    SysFileService localSysFileServiceImpl;

    // 以Minio框架实现的 文件持久化
    @Qualifier("MinioSysFileServiceImpl")
    @Autowired
    SysFileService minioSysFileServiceImpl;

    /**
     * 使用 LocalSysFileServiceImpl 实现文件上传持久化
     */
    @PostMapping("/upload")
    public R<SysFile> localUpload(MultipartFile multipartFile) {
        return getSysFileR(multipartFile, localSysFileServiceImpl);
    }

    /**
     * 使用 MinioSysFileServiceImpl 实现文件上传持久化
     */
    @PostMapping("/upload/minio")
    public R<SysFile> minioUpload(MultipartFile multipartFile) {
        return getSysFileR(multipartFile, minioSysFileServiceImpl);
    }

    private R<SysFile> getSysFileR(MultipartFile multipartFile, SysFileService localSysFileServiceImpl) {
        try {
            String url = localSysFileServiceImpl.uploadFile(multipartFile);
            SysFile sysFile = new SysFile();
            sysFile.setName(FileUtils.getName(url));
            sysFile.setUrl(url);
            return R.ok(sysFile);
        } catch (Exception exception) {
            LOGGER.error("上传文件失败", exception);
            return R.fail(exception.getMessage());
        }
    }
}
